home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / unixcpio.gz / unixnet.cpio / smisc.c < prev    next >
C/C++ Source or Header  |  1994-07-11  |  4KB  |  203 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "netuser.h"
  6. #include "timer.h"
  7. #include "tcp.h"
  8. #include "remote.h"
  9. #ifdef    UNIX
  10. #include <sys/types.h>
  11. time_t time();
  12. #endif
  13.  
  14. static struct tcb *disc_tcb,*echo_tcb;
  15. static struct socket remsock;
  16.  
  17. /* Start up discard server */
  18. dis1(argc,argv)
  19. int argc;
  20. char *argv[];
  21. {
  22.     struct socket lsocket;
  23.     void disc_recv(),misc_state();
  24.  
  25.     lsocket.address = ip_addr;
  26.     if(argc < 2)
  27.         lsocket.port = DISCARD_PORT;
  28.     else
  29.         lsocket.port = atoi(argv[1]);
  30.     disc_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,disc_recv,NULLVFP,misc_state,0,(char *)NULL);
  31. }
  32. /* Start echo server */
  33. echo1(argc,argv)
  34. int argc;
  35. char *argv[];
  36. {
  37.     void echo_recv(),echo_trans(),misc_state();
  38.     struct socket lsocket;
  39.  
  40.     lsocket.address = ip_addr;
  41.     if(argc < 2)
  42.         lsocket.port = ECHO_PORT;
  43.     else
  44.         lsocket.port = atoi(argv[1]);
  45.     echo_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,echo_recv,echo_trans,misc_state,0,(char *)NULL);
  46.  
  47. }
  48.  
  49. /* Start remote exit/reboot server */
  50. rem1(argc,argv)
  51. int argc;
  52. char *argv[];
  53. {
  54.     void uremote();
  55.  
  56.     remsock.address = ip_addr;
  57.     if(argc < 2)
  58.         remsock.port = REMOTE_PORT;
  59.     else
  60.         remsock.port = atoi(argv[1]);
  61.     open_udp(&remsock,uremote);
  62. }
  63.  
  64. /* Shut down miscellaneous servers */
  65. dis0()
  66. {
  67.     if(disc_tcb != NULLTCB)
  68.         close_tcp(disc_tcb);
  69. }
  70. echo0()
  71. {
  72.     if(echo_tcb != NULLTCB)
  73.         close_tcp(echo_tcb);
  74. }
  75. rem0()
  76. {
  77.     del_udp(&remsock);
  78. }
  79. /* Discard server receiver upcall */
  80. static
  81. void
  82. disc_recv(tcb,cnt)
  83. struct tcb *tcb;
  84. int16 cnt;
  85. {
  86.     struct mbuf *bp;
  87.  
  88.     if(recv_tcp(tcb,&bp,cnt) > 0)
  89.         free_p(bp);            /* Discard */
  90. }
  91.  
  92. /* Echo server receive
  93.  * Copies only as much will fit on the transmit queue
  94.  */
  95. static
  96. void
  97. echo_recv(tcb,cnt)
  98. struct tcb *tcb;
  99. int cnt;
  100. {
  101.     struct mbuf *bp;
  102.     int acnt;
  103.  
  104.     if(cnt == 0){
  105.         close_tcp(tcb);
  106.         return;
  107.     }
  108.     acnt = min(cnt,tcb->snd.wnd);
  109.     if(acnt > 0){
  110.         /* Get only as much will fit in the send window */
  111.         recv_tcp(tcb,&bp,tcb->snd.wnd);
  112.         send_tcp(tcb,bp);
  113.     }
  114. }
  115. /* Echo server transmit
  116.  * Copies anything that might have been left in the receiver queue
  117.  */
  118. static
  119. void
  120. echo_trans(tcb,cnt)
  121. struct tcb *tcb;
  122. int16 cnt;
  123. {
  124.     struct mbuf *bp;
  125.  
  126.     if(tcb->rcvcnt > 0){
  127.         /* Get only as much will fit in the send window */
  128.         recv_tcp(tcb,&bp,cnt);
  129.         send_tcp(tcb,bp);
  130.     }
  131. }
  132.  
  133. /* Log connection state changes; also respond to remote closes */
  134. /*ARGSUSED*/
  135. static
  136. void
  137. misc_state(tcb,old,new)
  138. register struct tcb *tcb;
  139. char old,new;
  140. {
  141.     switch(new){
  142.     case ESTABLISHED:
  143.         log(tcb,"open %d",tcb->conn.local.port);
  144.         break;
  145.     case CLOSE_WAIT:
  146.         close_tcp(tcb);
  147.         break;
  148.     case CLOSED:
  149.         log(tcb,"close %d",tcb->conn.local.port);
  150.         del_tcp(tcb);
  151.         /* Clean up if server is being shut down */
  152.         if(tcb == disc_tcb)
  153.             disc_tcb = NULLTCB;
  154.         else if(tcb == echo_tcb)
  155.             echo_tcb = NULLTCB;
  156.         break;
  157.     }
  158. }
  159. /* Process remote exit/reset command */
  160. /*ARGSUSED*/
  161. void
  162. uremote(sock,cnt)
  163. struct socket *sock;
  164. int16 cnt;
  165. {
  166.     struct mbuf *bp;
  167.     struct socket fsock;
  168.     char command,*cp;
  169.     long t;
  170.     extern FILE *logfp;
  171.     void iostop();
  172.  
  173.     time(&t);
  174.     cp = ctime(&t);
  175.     rip(cp);
  176.  
  177.     recv_udp(sock,&fsock,&bp);
  178.     command = pullchar(&bp);
  179.     switch(uchar(command)){
  180. #if    (defined(UNIX) | defined(MSDOS))
  181.     case SYS_RESET:
  182.         if(logfp != NULLFILE){
  183.             fprintf(logfp,"%s %s - REMOTE RESET\n",
  184.                 cp,psocket(&fsock));
  185.             fflush(logfp);
  186.             fclose(logfp);
  187.         }
  188.         sysreset();
  189.         break;    /* Not necessary */
  190. #endif
  191.     case SYS_EXIT:
  192.         if(logfp != NULLFILE){
  193.             fprintf(logfp,"%s %s - REMOTE EXIT\n",
  194.                 cp,psocket(&fsock));
  195.             fflush(logfp);
  196.             fclose(logfp);
  197.         }
  198.         iostop();
  199.         exit(0);
  200.         break;
  201.     }
  202. }
  203.